﻿#region 版权说明
/**********************************************************************
      * 功能说明:
      * 
      * CLR 版本:       4.0.30319.18033
      * 类 名 称:       WebServicesHelper
      * 命名空间:       Devil_System.Helper
      * 创建时间:       2013-05-09 08:57:49
      * 作    者:       Devil月哥
      * 版    权:       WebServicesHelper说明：本代码版权归Devil月哥所有 All Rights Reserved (C) 2013 - 2013
      * 网    站:       http://www.xd5u.com
      * 邮    箱:       webmaster@xd5u.com
      * 唯一标识：      647d22ca-50a8-413f-8e7d-f64717364f77  

      * 修改时间:
      * 修 改 人:
      * 
      ***********************************************************************/
#endregion

using System;

namespace Devil_System.Helper
{
    public class WebServicesHelper
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public WebServicesHelper() { }

        #region WebServices动态调用
        /// <summary>
        /// WebServices动态调用
        /// WebServices地址,调用的类名,调用的方法,参数
        /// </summary>
        /// <param name="Url">WebServices地址</param>
        /// <param name="ClassName">调用的类名</param>
        /// <param name="MethodName">调用的方法</param>
        /// <param name="Args">参数(没有参数写null)</param>
        /// <returns></returns>
        public static object WebServicesDynamic(string Url, string ClassName, string MethodName, object[] Args)
        {

            //返回值
            object returns = new object();
            try
            {
                //获取Web Service描述  
                System.Net.WebClient webClient = new System.Net.WebClient();
                //这里指定你自己的web service url，一定要以?WSDL结尾  
                System.IO.Stream stream = webClient.OpenRead(Url + "?WSDL");
                System.Web.Services.Description.ServiceDescription servicedescription =
                    System.Web.Services.Description.ServiceDescription.Read(stream);
                System.Web.Services.Description.ServiceDescriptionImporter servicedescriptionimporter = new
                    System.Web.Services.Description.ServiceDescriptionImporter();
                servicedescriptionimporter.ProtocolName = "soap";
                servicedescriptionimporter.Style =
                    System.Web.Services.Description.ServiceDescriptionImportStyle.Client;
                servicedescriptionimporter.AddServiceDescription(servicedescription, null, null);
                //指定命名空间
                //这里随便指定一个命名空间，但要与后面的一致
                System.CodeDom.CodeNamespace codenamespace = new System.CodeDom.CodeNamespace("Test");
                System.CodeDom.CodeCompileUnit codecompileunit = new System.CodeDom.CodeCompileUnit();
                codecompileunit.Namespaces.Add(codenamespace);
                servicedescriptionimporter.Import(codenamespace, codecompileunit);
                //建立C#编译器
                Microsoft.CSharp.CSharpCodeProvider csharpcodeprovider = new Microsoft.CSharp.CSharpCodeProvider();
                //失效
                //ICodeCompiler icodecompiler = csharpcodeprovider.CreateCompiler();
                System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
                cp.GenerateExecutable = false;
                cp.GenerateInMemory = true;
                //添加编译条件  
                cp.ReferencedAssemblies.Add("System.dll");
                cp.ReferencedAssemblies.Add("System.XML.dll");
                cp.ReferencedAssemblies.Add("System.Web.Services.dll");
                //编译程序集
                //失效
                //CompilerResults cr = icodecompiler.CompileAssemblyFromDom(cp, codecompileunit);
                System.CodeDom.Compiler.CompilerResults cr = csharpcodeprovider.CompileAssemblyFromDom(cp, codecompileunit);
                //检查是否编译成功
                if (!cr.Errors.HasErrors)
                {
                    //获取程序集
                    System.Reflection.Assembly assembly = cr.CompiledAssembly;
                    //获取程序集类型
                    Type type = assembly.GetType("Test." + ClassName, true);
                    object service = Activator.CreateInstance(type);
                    //获取方法
                    System.Reflection.MethodInfo mi = type.GetMethod(MethodName);
                    //调用方法  
                    //如果方法没有参数，第二个参数可以传递null
                    //否则就要传递object数组，数组元素的顺序要与参数的顺序一致 
                    //返回的是object类型，根据方法的签名，把返回值转换成不同的对象
                    returns = mi.Invoke(service, Args);
                }
                else
                {
                    //这里自己处理编译错误
                    //cr.Errors.ToString
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return returns;
        }
        #endregion

    }
}
